﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;

namespace IsAvailBr
{
    public class IsAvailResposta
    {
        public IsAvailStatus Status { get; set; }
        public ulong QueryId { get; set; }

        public string[] TicketsConcorrentes { get; set; }
        public DateTime DataExpiracao { get; set; }
        public DateTime DataInicio { get; set; }
        public DateTime DataFim { get; set; }
        public string[] DnsRegistrados { get; set; }
        public string[] Sugestoes { get; set; }
        public string MensagemResposta { get; set; }

        public string Fqdn { get; set; }
        public string FqdnAce { get; set; }
        public string StatusEspecifico { get; set; }

        public static IsAvailResposta FromResposta(string resposta, string dominio)
        {
            IsAvailResposta retorno = new IsAvailResposta();

            IEnumerable<string> argumentosResposta = resposta.Replace("\n", "").Split('\r').Where(x => !x.StartsWith("%") && x.Trim().Length > 0);
            string[] argumentosStatus = argumentosResposta.First().Split(' ');
            if (!argumentosStatus[0].Equals("ST"))
                throw new InvalidOperationException();

            retorno.Status = (IsAvailStatus)int.Parse(argumentosStatus[1]);
            retorno.QueryId = ulong.Parse(argumentosStatus[2]);

            if (argumentosResposta.Count() == 2)
            {
                // EXTRA INFO (0, 5, 8)
                string linhaUnica = argumentosResposta.ElementAt(1);
                if (linhaUnica.ToLower().Contains(dominio.ToLower()))
                {
                    // EXTRA INFO (0, 5)
                    if (linhaUnica.Contains("|"))
                    {
                        // EXTRA INFO 0
                        string[] argumentosFqdn = linhaUnica.Split('|');
                        retorno.Fqdn = argumentosFqdn[0];
                        retorno.FqdnAce = argumentosFqdn[1];
                    }
                    else
                    {
                        // EXTRA INFO (0, 5)
                        retorno.Fqdn = linhaUnica;
                    }
                }
                else
                {
                    // EXTRA INFO 8
                    retorno.MensagemResposta = linhaUnica;
                }
            }
            else if (argumentosResposta.Count() == 3)
            {
                // EXTRA INFO (1, 4, 6)
                retorno.Fqdn = argumentosResposta.ElementAt(1);
                string linha2 = argumentosResposta.ElementAt(2);
                if (linha2.Contains('|'))
                {
                    // EXTRA INFO (1, 2, 4, 6)
                    string[] argumentosLinha2 = linha2.Split('|');
                    if (linha2.Contains('-'))
                    {
                        DateTime dataInicio, dataFim;
                        dataInicio = DateTime.ParseExact(argumentosLinha2[0], "yyyy-MM-dd", CultureInfo.InvariantCulture);
                        if (DateTime.TryParseExact(argumentosLinha2[1], "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dataFim))
                        {
                            // EXTRA INFO 6
                            retorno.DataInicio = dataInicio;
                            retorno.DataFim = DateTime.ParseExact(argumentosLinha2[1], "yyyy-MM-dd", CultureInfo.InvariantCulture);
                        }
                        else
                        {
                            // EXTRA INFO 2
                            retorno.DataExpiracao = dataInicio;
                            retorno.StatusEspecifico = argumentosLinha2[1];
                            if (argumentosLinha2.Length > 2)
                            {
                                retorno.DnsRegistrados = new string[argumentosLinha2.Length - 2];
                                for (int i = 2; i < argumentosLinha2.Length; i++)
                                {
                                    retorno.DnsRegistrados[i - 2] = argumentosLinha2[i];
                                }
                            }
                        }
                    }
                    else
                    {
                        // EXTRA INFO 1
                        retorno.TicketsConcorrentes = argumentosLinha2;
                    }
                }
                else
                {
                    // EXTRA INFO 4
                    retorno.MensagemResposta = linha2;
                }
            }
            else if (argumentosResposta.Count() == 4)
            {
                // EXTRA INFO (2, 3, 7)
                retorno.Fqdn = argumentosResposta.ElementAt(1);
                string linha2 = argumentosResposta.ElementAt(2);
                string linha3 = argumentosResposta.ElementAt(3);
                string[] argumentosLinha3 = linha3.Split('|');
                DateTime dataInicio, dataFim;
                if (DateTime.TryParseExact(linha2.Substring(0, 10), "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dataInicio))
                {
                    // EXTRA INFO (2, 7)
                    string[] argumentosLinha2 = linha2.Split('|');
                    if (DateTime.TryParseExact(argumentosLinha2[1], "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dataFim))
                    {
                        // EXTRA INFO 7
                        retorno.DataInicio = dataInicio;
                        retorno.DataFim = dataFim;
                        retorno.TicketsConcorrentes = argumentosLinha3;
                    }
                    else
                    {
                        // EXTRA INFO 2
                        retorno.DataExpiracao = dataInicio;
                        retorno.StatusEspecifico = argumentosLinha2[1];
                        if (argumentosLinha2.Length > 2)
                        {
                            retorno.DnsRegistrados = new string[argumentosLinha2.Length - 2];
                            for (int i = 2; i < argumentosLinha2.Length; i++)
                            {
                                retorno.DnsRegistrados[i - 2] = argumentosLinha2[i];
                            }
                        }
                        retorno.Sugestoes = argumentosLinha3;
                    }
                }
                else
                {
                    // EXTRA INFO 3
                    retorno.MensagemResposta = linha2;
                    retorno.Sugestoes = argumentosLinha3;
                }
            }
            else
            {
                // DEU PAU
                retorno.MensagemResposta = resposta;
            }
            return retorno;
        }
    }
}
